#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static int is_running = 1;

SubProcess *sub_processes[SUB_PROCESS_COUNT];

void stop_handler(int signo)
{
    is_running = 0;
}

/**
 * 守护进程的主程序
 * //1  程序后台化 daemon()
 * //2  重定向日志 把控制台的日志 重定向到日志文件
 * //3  注册终止信号的处理函数
 * //4 初始化 子进程
 * //5 不断检查启动子进程
 * //6 退出所有子进程
 */
int daemon_runner_start()
{
    // 程序进程后台化
    // 参数1 0 把e程序主目录改为/  参数2  0：关闭 输入输出错误 1 不关闭
    daemon(0, 1);

    // 关闭控制台输入 将日志输出重定向到日志文件
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/dev/null", O_RDWR);                           // 标准输入 =》 丢弃所有写入的数据
    open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND, 0644); // 标准输出
    open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND, 0644); // 标准错误输出

    // 注册终止信号处理函数
    signal(SIGTERM, stop_handler);

    // 初始化子进程
    sub_processes[0] = daemon_sub_process_init("app");
    sub_processes[1] = daemon_sub_process_init("ota");

    // 每隔2秒检查并启动子进程
    while (is_running)
    {
        for (int i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            daemon_sub_process_checkStart(sub_processes[i]);
        }
        sleep(2);
    }

    // 退出所有子程序
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_exit(sub_processes[i]);
    }

    return 0;
}
